# Spark Manifests

# 用于展开已描述的清单配置，通过它可以提供你所需要的默认计划
# 1. git 仓库
# 2. go 模块自动 tidy
# 3. 拉取组件后的清单配置计划

# 默认清单项存储到清单层所在的上层目录
set(SPARK_MANIFESTS_TO "${CMAKE_SOURCE_DIR}/..")

# 提供一个指令用于展开你的项目模块
# spark_manifests_from_git 
    # PREFIX <prefix> 
    # COMPONENTS <component> [..] 
    # [STORE <savedir>]
    # [POST_COMMAND <command> [..]]
# 
function(spark_manifests_from_git)

    # 1. 解析参数，使用原生 cmake 提供的参数解析器
    # set(OPTIONS)
    set(ONEVARG PREFIX STORE)
    set(MULVARG COMPONENTS POST_COMMAND)

    cmake_parse_arguments(SPARK "" "${ONEVARG}" "${MULVARG}" ${ARGN})

    # 锚定默认存储位置(标准位置目录 + 自定义存储点)
    # 当存在 STORE 参数则追加清单项自定义存储点
    set(SPARK_MANIFESTS_STEP_STORE "${SPARK_MANIFESTS_TO}")
    if(SPARK_STORE)
        set(SPARK_MANIFESTS_STEP_STORE "${SPARK_MANIFESTS_TO}/${SPARK_STORE}")
    endif(SPARK_STORE)
    
    # 2. 如果包含 PREFIX 则开始进行解析
    if(SPARK_PREFIX)
        
        # 如果不存在存储目录则创建它
        if(NOT EXISTS ${SPARK_MANIFESTS_STEP_STORE})
            execute_process(COMMAND ${CMAKE_COMMAND} 
                -E make_directory ${SPARK_MANIFESTS_STEP_STORE})
        endif(NOT EXISTS ${SPARK_MANIFESTS_STEP_STORE})

        foreach(SPARK_COMPONENT IN LISTS SPARK_COMPONENTS)

            # 1. 不存在则克隆仓库
            if(NOT EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT})
                # git clone
                execute_process(COMMAND git clone ${SPARK_PREFIX}/${SPARK_COMPONENT}
                    WORKING_DIRECTORY ${SPARK_MANIFESTS_STEP_STORE})
            endif(NOT EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT})
            
            # 2. 存在则准备执行操作
            if(EXISTS "${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}")
                message("[SparkManifests] Exits: ${SPARK_COMPONENT}")

                # git pull
                if(EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}/.git)
                    # 拉取项目
                    execute_process(COMMAND git pull
                        WORKING_DIRECTORY ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT})
                endif(EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}/.git)
                
                # go mod tidy
                if(EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}/go.mod)
                    # 清理与整理 Go 模块的依赖
                    execute_process(COMMAND go mod tidy
                        WORKING_DIRECTORY ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT})
                endif(EXISTS ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}/go.mod)

            endif(EXISTS "${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT}")

            # 3. 当存在 POST_COMMAND 时执行预设的命令
            if(SPARK_POST_COMMAND)
                execute_process(COMMAND ${SPARK_POST_COMMAND}
                    WORKING_DIRECTORY ${SPARK_MANIFESTS_STEP_STORE}/${SPARK_COMPONENT})
            endif(SPARK_POST_COMMAND)
            
        endforeach(SPARK_COMPONENT IN LISTS SPARK_COMPONENTS)
    endif(SPARK_PREFIX)
endfunction(spark_manifests_from_git)
